perm filename MPX.MIC[MPX,SYS] blob sn#699497 filedate 1983-02-26 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00002 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002	SET SPT=20000			SPECIAL PAGES TABLE BEGINS AT 20000
C00020 ENDMK
C⊗;
SET SPT=20000			;SPECIAL PAGES TABLE BEGINS AT 20000

LOC 0
;GET HERE ON POWER-ON RESET, I/O BUS RESET AND CONO RESET
;RESET_COND IS SET IF I/O BUS RESET OR POWER-ON RESET BUT IS IGNORED
;BY THIS VERSION OF THE MICROCODE.  IT CAN BE CLEARED BY A SUCCESSFUL
;BRANCH ON RESET_COND.
ZAP:
;WE NEED TO CLEAR ALL VBIT ENTRIES AND ALL MAP ENB ENTRIES
	AR,BR=0/SPEC=5		;GET CONTROL OF SEL BUS, ETC
				;-AR[10-12] → -SEL BUS, AR[13-15] → PADR [20-22]
RSWAIT:	JUMPIF ~MEM_DONE RSWAIT	;WAIT UNTIL WE GET CONTROL
RSVLUP:	~SEL_BUS_REG=¬<AR←-3,7>/SPEC=13
				;-SEL BUS←-AR[10-12], CLEAR MCYC MEM DONE
	MA_HI=<AR←4,7←4>	;MA HI[20-22]←AR[13-15]
	VBIT=0			;CLEAR 16 VBIT ENTRIES, FOR DEVICE WHOSE
				;# IS IN SEL BUS FOR PGS MA HI[20-22]=0,1...
	<AR> JUMPIF MASK[0] RSL1;DON'T CLEAR MAP ENB IF AR BIT 0 IS ON
	MAP_ENB=0		;CLEAR MAP ENB BIT FOR DEVICE WHOSE # IS IN LOW
				;3 BITS OF AR
RSL1:	AR=≡000101+AR		;INCREMENT AR[10-15] AND [4-9]
	<AR←3> JUMPIF ~MASK[0] RSVLUP
				;IF AR[3] IS OFF, THERE IS MORE TO DO
	AR=0/SPEC=4		;RELEASE CONTROL OF SEL BUS, ETC. CLEAR CYC IN PROG
CLRBSY:	BR=0/SPEC=10		;CLEAR MIOBC BUSY

IDLE:	JUMPIF MICRQ_RQ_SYNC MICRQ	;BRANCHING CLEARS MICRQ RQ SYNC
	JUMPIF MIOBC_BUSY IOBUSY	;BRANCHING CLOCKS MS FROM I
	JUMPIF TRUE IDLE

;GET HERE ON DATAO MPX OR CONO MPX BITS 22, 23, 30, 31
;MS HAS BEEN LOADED WITH THE I/O BUS DATA EXCEPT FOR BIT 1 WHICH IS
;0 FOR CONO AND 1 FOR DATAO
IOBUSY:	<MS[0_3]←13.> JUMPIF ~MASK[0] CONO
				;JUMP IF MS[1] IS CLEAR (I.E. CONO)
	<MS[0_3]←12.> JUMPIF ~MASK[0] LDPTP
				;JUMP IF MS[0] IS CLEAR (I.E. LOAD PAGE TABLE
				;POINTER)
;GET HERE ON DATAO TO LOAD MICROCODE.  THE PAGE NUMBER OF THE CORE PAGE THAT
;CONTAINS THE MICROCODE IS IN MS[23-35]
	MA_HI=<MS[20_35]>	;LOAD UP HI PART OF ADDRESS OF MICROCODE
	BR=0			;BR → LO PART OF ADDRESS OF MICROCODE
	AR=≡40			;MICROSTORE ADDRESS TO WRITE IN NEXT
MLDLP:	MA_LO=BR/SPEC=6		;GET CONTROL OF SEL BUS, ETC. AND BEGIN READ CYC
MLRWT:	JUMPIF ~MEM_DONE MLRWT	;WAIT UNTIL THE CYCLE IS FINISHED
	BR=<BR>+1/SPEC=3	;WRITE MS INTO MICROSTORE AT ADDRESS POINTED TO
				;BY AR.  COUNT BR TO NEXT MEM ADDRESS.
	/SPEC=13		;CLEAR MCYC MEM DONE
	AR=<AR>+1/SPEC=4	;COUNT MICROSTORE ADDRESS AND RELEASE SEL BUS, ETC.
	JUMPIF MICRO_RPE MLPAR
	<AR←7> JUMPIF ~MASK[0] MLDLP
				;THERE IS MORE TO DO UNLESS AR[7] IS CARRIED INTO
	JUMPIF TRUE CLRBSY	;DONE, CLEAR MIOBC BUSY AND FALL INTO IDLE LOOP

MLPAR:	/SPEC=12		;SET MPXERR PAR ERR AND GIVE UP
	JUMPIF TRUE CLRBSY

;ALL CODE BETWEEN THE TOP OF THE PAGE AND HERE GOES IN THE ROM.
;THAT'S 29 WORDS FOLKS, WE MADE IT!!



LOC 40

;GET HERE ON DATAO WITH I/O BUS BIT 0 OFF.  BUS BITS 15-17 ARE THE DEVICE
;WHOSE PAGE TABLE POINTER WE WISH TO SET AND BITS 23-35 ARE THE 13 BITS
;PAGE TABLE POINTER (PAGE NUMBER)
LDPTP:	AR=<MS[4_19]←-2,17>	;LOAD LOW 4 AR BITS WITH DEVICE CODE
	~PTPNT=¬<MS[20_35]>	;WRITE ¬MS[23-35] INTO ¬PTPNT(AR)
	JUMPIF TRUE CLRBSY	;CLEAR MIOBC BUSY AND FALL INTO IDLE LOOP



CONO:	<MS[20_35]←11.> JUMPIF MASK[0] ENBMAP
				;JUMP IF MS[31] IS SET (I.E. CONO ENABLE MAPPING)
	<MS[20_35]←10.> JUMPIF MASK[0] CLRMAP
				;JUMP IF MS[30] IS SET (I.E. CONO CLEAR MAPPING)
;GET HERE FOR CONO RESET DEVICE WHOSE NUMBER IS IN MS[24-26]
	AR=<MS[20_35]←-9,7>	;DEVICE TO RESET (FROM MS[24-26])
	BR,MAP_ENB=0		;CLEAR MAP ENABLE FOR THE SPECIFIED DEVICE
	AR=<AR←3,7←3,BR>/SPEC=5	;GET CONTROL OF SEL BUS, ETC.  SET AR 10-12 TO
				;DEVICE CODE SPECIFIED IN MS[24-26]
	AR=≡107000∨AR		;COUNT OUT AFTER ONE DEVICE, BIT 0 USED AS FLAG
				;TO AVOID CLEARING MAP ENB
	JUMPIF TRUE RSWAIT	;GO RESET THE VALID BITS FOR THIS DEVICE

;GET HERE TO CLEAR OR SET THE MAP ENB BIT FOR DEVICE WHOSE NUMBER
;IS IN MS[24-26]
CLRMAP:
ENBMAP:	AR=<MS[20_35]←-9,7>	;AR GETS DEVICE CODE FROM MS[24-26]
	MAP_ENB=<MS[20_35]←-4,1>;STORE APPROPRIATE BIT (MS[31]) IN MAP ENB(AR)
				;1 FOR ENABLE MAPPING AND 0 FOR DISABLE MAPPING
	JUMPIF TRUE CLRBSY	;CLEAR MIOBC BUSY AND FALL INTO IDLE LOOP



;GET HERE WHEN SOME DEVICE REQUESTS A MAPPED CYCLE FOR WHICH THERE IS NO
;VALID INFORMATION IN THE MAPPING RAMS
MICRQ:	~SEL_BUS_REG=¬<MICRQ_SEL←-4,7>/SPEC=14
				;SET SEL BUS REG FROM MICRQ SEL 4,2,1
				;CLEAR REQUESTING DEVICE'S MICRQ
	MA_HI=<PTPNT>		;HI ORDER PART OF MA COMES FROM PAGE TABLE POINTER
				;FOR READING, PTPNT IS ADDRESSED BY MICRQ SEL 4,2,1
	MA_LO=<PADR_MICRO←-7,777>/SPEC=6
				;LO ORDER PART OF MA COMES FROM VIRT PAGE NUMBER
				;GET CONTROL OF SEL BUS, ETC AND DO READ CYCLE
	BR=<~VBIT_NEW_BIT>	;ACTIVE LOW BIT TO BE ORED INTO THIS VBIT WORD
	AR=<PADR_MICRO,3←14.>	;INITIALIZE AR FOR STORING INTO MAPRAM.
				;START WITH PADR MICRO 18-19 IN HIGH TWO BITS
MRQWT:	JUMPIF ~MEM_DONE MRQWT	;WAIT UNTIL WE HAVE CONTROL AND THE WORD IS READ
	MA_HI=<PADR_MICRO←-7,177>/SPEC=13
				;MAHI[20-26]←PADR_MICRO[20-26] AND CLEAR MEM DONE
	JUMPIF MICRO_RPE PTPAR	;JUMP IF PARITY ERROR IN READING PAGE TABLE
				;BRANCHING CLEARS MPXERR MICRO RD PAR ERR
	VBIT=¬(<~VBIT,,BR>∧BR)	;THAT'S LIKE VBIT=VBIT∨¬BR.  VBIT IS ADDRESSED
				;BY SEL BUS 4,2,1 AND PADR 20-22.
	BR=0
	AR=¬<MS[0_3]←13.,1←13.,AR>
				;OR IN WRITE ACCESS BIT (MS[3]) AND
				;COMPLEMENT IT AND SECT 18-19
	<MS[0_3],3←2,BR> JUMPIF ~MASKIS0 NOTPRV
				;JUMP IF MS[0-1] NON-ZERO, I.E. NOT A PRIV PAGE
	ABIT=<MS[0_3]←-1>	;STORE ACCESS BIT (MS[2]) IN THE ABIT RAM
MAPSTR:	<MS[4_19],17←2,BR> JUMPIF ~MASKIS0 NINCOR
				;JUMP IF MS[14-17] NON-ZERO, I.E. NOT IN CORE
	MAPRAM=<MS[20_35],17777,AR>/SPEC=7
				;MASK IN THE MAPPED PAGE NUMBER (MS[23-35]) AND 
				;STORE IT, THE WRITE ACCESS BIT AND SECT 18-19
				;IN THE MAPPING RAM (IT AND ABIT ARE ADDRESSED
				;BY SEL BUS 4,2,1 AND PADR 20-26.
				;CLEAR STARTED BIT FOR DEVICE IN MICRQ SEL LATCH
MAPXIT:	/SPEC=4			;RELEASE CONTROL OF SEL BUS, ETC.
	JUMPIF TRUE IDLE/SPEC=1	;RELEASE MICRQ SEL LATCH




;GET HERE IF A PARITY ERROR OCCURRED READING A PAGE TABLE WORD
PTPAR:	/SPEC=11		;SET PT PAR ERR FOR DEVICE IN MICRQ SEL 4,2,1
	/SPEC=4			;RELEASE CONTROL OF SEL BUS, ETC.
	JUMPIF TRUE IDLE/SPEC=1	;RELEASE MICRQ SEL LATCH.  THE STARTED LATCH FOR
				;THIS DEVICE IS STILL SET, INHIBITING IT FROM
				;BEING SEEN FOR FUTURE REQUESTS.  RESETTING THE
				;DEVICE WILL CLEAR ITS STARTED LATCH.



;GET HERE WHEN BITS 14-17 OF THE PAGE TABLE ENTRY ARE NON-ZERO, INDICATING
;THAT THE PAGE IS NOT IN CORE
NINCOR:	ABIT=0/SPEC=7		;SET ACCESS BIT IN ABIT RAM TO ZERO.  WILL GET
				;ACCESS VIOLATION WHEN THIS CYCLE HAPPENS AGAIN
				;CLEAR STARTED BIT FOR DEVICE IN MICRQ SEL LATCH
	JUMPIF TRUE MAPXIT



;GET HERE WHEN THE PAGE TABLE ENTRY (IN MS) IS NOT A PRIVATE PAGE TYPE.
;BITS MS[0-1] ARE NON-ZERO.  0 1 INDICATES A SHARED PAGE, 1 0 INDICATES
;AN INDIRECT PAGE.  1 1 IS UNDEFINED.
NOTPRV:	AR=¬<MS[4_19]←-7>/SPEC=4
				;AR(15) ← ¬ MS[12], THE ACCESS PERMIT BIT
				;RELEASE SEL BUS, ETC.
	AR=<MS[0_3]←13.,1←13.,AR>
				;AR(2) ←  MS[3], THE WRITE PERMIT BIT
	;****NOTE BR WAS SET ZERO EARLIER****
	BR=<MS[4_19]←7,77←7,BR>	;BR(3-8) ← MS[14-19]
	BR=<MS[20_35]←-9,177,BR>
				;BR(9-15) ← MS[20-26]
	BR=≡SPT+BR		;THIS IS THE ADDRESS WE WANT TO READ IN THE SPT
	MA_LO=BR		;MA_LO=BR(7-15)=MS[18-26]
	<MS[0_3]←12.> JUMPIF MASK[0] NOTSHR
				;JUMP IF MS[0] IS ON, I.E. NOT SHARED
	MA_HI=<BR←-9,177,BR>/SPEC=6
				;MA_HI=BR(0-6), BEGIN READ CYCLE
SHRWAT:	JUMPIF ~MEM_DONE SHRWAT	;WAIT UNTIL WE GET THE SPT ENTRY
	MA_HI=<PADR_MICRO←-7,177>/SPEC=13
				;MAHI[20-26]←PADR_MICRO[20-26] AND CLEAR MEM DONE
	JUMPIF MICRO_RPE NPRPAR	;JUMP IF GOT PARITY ERROR WHILE READING SPT
	AR=¬<PADR_MICRO,3←14.,AR>
				;AR(0-1) ← ¬ PADR MICRO 18-19
				;AR(2) ← ¬ WRITE PERMIT
				;AR(15) ← ACCESS BIT
	ABIT=AR			;STORE ACCESS BIT IN ABIT RAM
	BR=0
	JUMPIF TRUE MAPSTR	;GO STORE MAPRAM AND EXIT




;GET HERE IF WE GOT PARITY ERROR WHILE READING SPECIAL PAGE TABLE ENTRY
;VBIT HAS BEEN TURNED ON, MUST BE TURNED OFF AND PT PAR ERR MUST BE SET
;FOR THE DEVICE IN MICRQ SEL 4,2,1.
NPRPAR:	BR=¬<~VBIT_NEW_BIT>	;THIS IS THE BIT TO TURN OFF IN VBIT
	VBIT=¬(<~VBIT,,BR>∨BR)	;THAT'S LIKE VBIT∧¬BR
	JUMPIF TRUE PTPAR




;GET HERE WHEN THE PAGE TABLE ENTRY (IN MS) IS NOT PRIVATE OR SHARED.
;MS[0] IS A ONE.  MS[1] SHOULD BE ZERO FOR AN INDIRECT PAGE TABLE ENTRY.
;MS[1] BEING A ONE IS ILLEGAL AND WILL CAUSE A PAGE NOT IN CORE TYPE TRAP.
NOTSHR:	<MS[0_3]←13.> JUMPIF ~MASK[0] NINCOR
				;JUMP IF MS[1] IS ON, I.E. MS[0-1] = 11
	MA_HI=<BR←-9,177,BR>	;MA_HI=BR(0-6)
	BR=<MS[20_35]>/SPEC=6	;BR = MS[27-35] = PAGE NUMBER TO LOOK UP
				;IN NEW PAGE TABLE.  BEGIN READ CYCLE.
NSHWAT:	JUMPIF ~MEM_DONE NSHWAT
	MA_HI=<PADR_MICRO←-7,177>/SPEC=13
				;MAHI[20-26]←PADR_MICRO[20-26] AND CLEAR MEM DONE
	JUMPIF MICRO_RPE NPRPAR	;JUMP IF GOT PARITY ERROR WHILE READING SPT
	MA_LO=<BR>/SPEC=4	;PAGE NUMBER TO LOOK AT IN NEW PAGE TABLE
				;RELEASE CONTROL OF SEL BUS, ETC.
	BR=0
	<MS[4_19],17←2,BR> JUMPIF ~MASKIS0 NINCOR
				;JUMP IF SPT ENTRY POINTS TO PAGE TABLE NOT IN CORE
	MA_HI=<MS[20_35]>/SPEC=6
				;MAHI = MS[23-35] = PAGE NUMBER OF NEW PAGE TABLE
				;BEGIN READ CYCLE
NSHWA1:	JUMPIF ~MEM_DONE NSHWA1
	MA_HI=<PADR_MICRO←-7,177>/SPEC=13
				;MAHI[20-26]←PADR_MICRO[20-26] AND CLEAR MEM DONE
	JUMPIF MICRO_RPE NPRPAR	;JUMP IF GOT PARITY ERROR WHILE READING INDIR ENTRY

END